Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix typechecking for async generators #17452

Merged
merged 1 commit into from
Jun 30, 2024
Merged

Conversation

yangdanny97
Copy link
Contributor

Fixes #10534

This PR fixes a bug in typechecking asynchronous generators.

Mypy currently typechecks a generator/comprehension as AsyncGenerator if the leftmost expression contains await, or if it contains an async for.

However, there are other situations where we should get async generator: If there is an await expression in any of the conditions or in any sequence except for the leftmost one, the generator/comprehension should also be typechecked as AsyncGenerator.

I've implemented this change in Mypy and added a test case to assert this behavior. If I enter the test cases into a regular repl, I can confirm that the runtime representation is generator/async_generator as the test case expects.

According to the language reference:

If a comprehension contains either async for clauses or await expressions or other asynchronous comprehensions it is called an asynchronous comprehension.

Confusingly, the documentation itself is actually not quite correct either, as pointed out in python/cpython#114104

Alongside this change, I've made a PR to update the docs to be more precise: python/cpython#121175 has more details.

Copy link
Contributor

According to mypy_primer, this change doesn't affect type check results on a corpus of open source code. ✅

Copy link
Collaborator

@hauntsaninja hauntsaninja left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice, thank you!

@hauntsaninja hauntsaninja merged commit 02d3667 into python:master Jun 30, 2024
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Generator with await not considered an AsyncGenerator
2 participants